package com.qfmy.core.security.impl;

import com.qfmy.common.pojo.LoginUser;
import com.qfmy.common.pojo.TokenVo;
import com.qfmy.common.utils.StringUtils;
import com.qfmy.core.security.SecurityUserService;
import com.qfmy.core.pojo.exception.CustomException;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;

/**
 * 描述:
 *      Security登录接口实现
 * @author zhengjt
 * @date 2022-10-21 15:38:14
 */
@Slf4j
@Service
public class SecurityUserServiceImpl implements SecurityUserService {

    /**
     * 根据用户名，获取数据库中用户信息
     * @param username 用户名
     * @return
     * @throws UsernameNotFoundException
     */
    @SneakyThrows
    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        log.info(" ========= Security登录接口实现 ========== ");

        if (StringUtils.isNull(username)){
            throw new CustomException("用户名不能为空！");
        }

        //  TODO 查询数据库，获取用户信息
        //  1、获取系统用户实体类
        //  2、判断用户是否存在，存在进入下一步，不存在则抛出异常；
        //  3、获取用户权限， List<String> 权限list
        //  4、对应信息处理，塞入LoginUser，return LoginUser；
        /*
            伪代码：
            SysUser = sysUserService.getUser
            if(sysUser == null){
                抛出异常
            }
            List<String> 权限list = 权限Service.get权限list(sysUser.getUserId)
            LoginUser.set...
            return LoginUser;
         */

        //  TODO ↓模拟数据，逻辑完成后删除或者注释
        LoginUser loginUser = new LoginUser();
        TokenVo object = new TokenVo();
        object.setUserId("000001");
        object.setUserName("test");
        object.setUserNick("测试 - 开发者");
        object.setDeptId("000000001");
        object.setDeptName("测试部门");
        object.setCorpId("000000001");
        object.setCorpName("测试Corp");
        object.setOrgId("000000001");
        object.setOrgName("测试Org");
        loginUser.setTokenUser(object);

        List<String> list = new ArrayList<>();
        list.add("LOGIN_MENU");
        list.add("TEST_MENU");
        loginUser.setPermissions(list);
        //  ↑ 模拟数据至此

        return loginUser;
    }
}
